package com.ddl.pay;

import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.Arrays;
import java.util.Map;

/**
 * Created by IntelliJ IDEA.
 *
 * @author <a href="mailto:zjggle@gmail.com">Richard Zhou</a>
 * @version 1.0
 * @CreationTime: 2015/9/11
 * @Description:
 */
public class SignatureUtil {

    /**
     * 生成 package 字符串
     *
     * @param map
     * @param paternerKey
     * @return
     */
    public static String generatePackage(Map<String, String> map, String paternerKey) {
        String sign = generateSign(map, paternerKey);
        Map<String, String> tmap = MapUtil.order(map);
        String s2 = MapUtil.mapJoin(tmap, false, true);
        return s2 + "&sign=" + sign;
    }

    /**
     * 生成 paySign
     *
     * @param map
     * @param paySignKey
     * @return
     */
    public static String generatePaySign(Map<String, String> map, String paySignKey) {
        if (paySignKey != null) {
            map.put("appkey", paySignKey);
        }
        Map<String, String> tmap = MapUtil.order(map);
        String str = MapUtil.mapJoin(tmap, true, false);
        return DigestUtils.shaHex(str);
    }

    /**
     * 生成事件消息接收签名
     *
     * @param token
     * @param timestamp
     * @param nonce
     * @return
     */
    public static String generateEventMessageSignature(String token, String timestamp, String nonce) {
        String[] array = new String[]{token, timestamp, nonce};
        Arrays.sort(array);
        String s = StringUtils.arrayToDelimitedString(array, "");
        return DigestUtils.shaHex(s);
    }


    /**
     * 生成sign MD5 加密 toUpperCase
     *
     * @param map
     * @param paternerKey
     * @return
     */
    public static String generateSign(Map<String, String> map, String paternerKey) {
        //去给map key排序  a  b  c  d  e  f
        Map<String, String> tmap = MapUtil.order(map);
        //删除sgin ，签名不参与算法
        if (tmap.containsKey("sign")) {
            tmap.remove("sign");
        }
        System.out.println("temp - remove key = sgin："+tmap.toString());
        String str = MapUtil.mapJoin(tmap, false, false);
        System.out.println("解读Map  参数串连："+str);
        String signupcase= DigestUtils.md5Hex(str + "&key=" + paternerKey).toUpperCase();
        System.out.println("微信算出签名结果:"+signupcase);
        return signupcase;
    }


//    /**
//     * 验证  pay feedback appSignature 签名
//     *
//     * @param payFeedback
//     * @param paySignKey  公众号支付请求中用于加密的密钥Key,
//     *                    可验证商户唯一身份,对应于支付场景中的 appKey 值
//     * @return
//     */
//    public static boolean validateAppSignature( PayFeedback payFeedback, String paySignKey) {
//        Map<String, String> map = MapUtil.objectToMap(payFeedback,
//                "msgtype",
//                "appsignature",
//                "signmethod",
//                "feedbackid",
//                "transid",
//                "reason",
//                "solution",
//                "extinfo",
//                "picInfo");
//        return payFeedback.getAppsignature().equals(generatePaySign(map, paySignKey));
//    }
//
//
//    /**
//     * 验证  pay native appSignature 签名
//     *
//     * @param payNativeInput
//     * @param paySignKey     公众号支付请求中用于加密的密钥Key,
//     *                       可验证商户唯一身份,对应于支付场景中的 appKey 值
//     * @return
//     */
//    public static boolean validateAppSignature(PayNativeInput payNativeInput, String paySignKey) {
//        Map<String, String> map = MapUtil.objectToMap(payNativeInput, "appsignature", "signmethod");
//        return payNativeInput.getAppsignature().equals(generatePaySign(map, paySignKey));
//    }
//
//
//    /**
//     * 验证  pay notify appSignature 签名
//     *
//     * @param payNotify
//     * @param paySignKey 公众号支付请求中用于加密的密钥Key,
//     *                   可验证商户唯一身份,对应于支付场景中的 appKey 值
//     * @return
//     */
//    public static boolean validateAppSignature(PayNotify payNotify, String paySignKey) {
//        Map<String, String> map = MapUtil.objectToMap(payNotify, "appsignature", "signmethod");
//        return payNotify.getAppsignature().equals(generatePaySign(map, paySignKey));
//    }
//
//    /**
//     * 验证  pay warn appSignature 签名
//     *
//     * @param payWarn
//     * @param paySignKey 公众号支付请求中用于加密的密钥Key,
//     *                   可验证商户唯一身份,对应于支付场景中的 appKey 值
//     * @return
//     */
//    public static boolean validateAppSignature(PayWarn payWarn, String paySignKey) {
//        Map<String, String> map = MapUtil.objectToMap(payWarn, "appsignature", "signmethod");
//        return payWarn.getAppsignature().equals(generatePaySign(map, paySignKey));
//    }
//
//    /**
//     * 验证 mch pay notify sign 签名
//     *
//     * @param mchPayNotify
//     * @param key          mch key
//     * @return
//     */
//    public static boolean validateAppSignature(MchPayNotify mchPayNotify, String key) {
//        Map<String, String> map = MapUtil.objectToMap(mchPayNotify);
//        return mchPayNotify.getSign().equals(generateSign(map, key));
//    }

}
